home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 4
/
Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso
/
Development
/
Source
/
SCSI
/
scsi sample.c
next >
Wrap
Text File
|
1992-07-03
|
4KB
|
203 lines
//Matt,
//Here a routine that we use. HoldBufferMemory is used to lock memory for VM.
#include <stdio.h>
#include <scsi.h>
#include <stdlib.h>
#include "scsi sample.h"
#define HoldBufferMemory(a, b) HoldMemory(a, b)
#define ReleaseBufferMemory(a, b) UnholdMemory(a, b)
#define kSCSIStatusMask 0x1f
#define kGood 0x00
#define kCheckCondition 0x02
#define kBusy 0x08
#define kReservationConflict 0x18
#define kSCSIRetryValue 5
#define bLogicalUnitLSB 5
#define kCommandComplete 0x00
#define kExtendedMessage 0x01
#define kSaveDataPointer 0x02
#define kRestorePointers 0x03
#define kDisconnect 0x04
#define kMessageReject 0x07
#define kLinkedCommandComplete 0x0a
#define kLinkedCommandCompleteWithFlags 0x0b
enum
{
eSCSIReservationConflict=0xf000,
eSCSIBusy,
eDisconnect,
eMessageReject,
eReplyTOErr
};
#define DoSCSISenseUnit(TargetSCSIID, LogicalUnit) FindError(TargetSCSIID)
//#pragma segment SCSISupport
//CorPascal OSErr
OSErr
DoSCSIOutput(
short TargetSCSIID,
short scsiCmdSize,
void * scsiCmd,
SCSIInstr *scsiInst,
short RdWrNone,
long TimeOut)
{
short ReturnedSCSIStat;
short ReturnedSCSIMessage;
short NumTries = 0;
short stat;
OSErr err;
OSErr err1;
short i;
short message;
HoldBufferMemory(scsiCmd, scsiCmdSize);
HoldBufferMemory(scsiInst, 100);
while (NumTries++ < kSCSIRetryValue)
{
err = SCSIGet();
if (err == noErr)
{
err = SCSISelect(TargetSCSIID);
if (err == noErr)
{
err = SCSICmd((Ptr)(scsiCmd), scsiCmdSize);
if (err == noErr)
{
stat = SCSIStat();
switch (RdWrNone)
{
case scsiReadXfer:
err = SCSIRead((Ptr)scsiInst);
break;
case scsiWriteXfer:
err = SCSIWrite((Ptr)scsiInst);
break;
default:
break;
}
}
err1 = SCSIComplete(&ReturnedSCSIStat, &ReturnedSCSIMessage, TimeOut);
if (err == noErr)
{
if (err1 == noErr)
{
switch (ReturnedSCSIStat & kSCSIStatusMask)
{
case kGood:
err = noErr;
break;
// case kConditionMetGood:
// err = noErr;
// break;
// case kIntermediateGood:
// err = noErr;
// break;
// case kIntermediateMetGood:
// err = noErr;
// break;
case kReservationConflict:
err = eSCSIReservationConflict;
break;
case kBusy:
err = eSCSIBusy;
break;
case kCheckCondition:
switch (ReturnedSCSIMessage)
{
case kCommandComplete:
case kLinkedCommandCompleteWithFlags:
case kLinkedCommandComplete:
err = DoSCSISenseUnit(TargetSCSIID,
scsiCmd->LUN_Res >> bLogicalUnitLSB);
break;
case kExtendedMessage:
if (SCSIMsgIn(&message) == noErr)
{
for (i = 0; i < message; i++)
{
if (SCSIMsgIn(&message) != noErr)
break;
}
}
break;
case kSaveDataPointer:
break;
case kRestorePointers:
break;
case kDisconnect:
err = eDisconnect;
case kMessageReject:
err = eMessageReject;
default:
if (ReturnedSCSIMessage >= 0x80)
{
err = noErr;
}
else
err = DoSCSISenseUnit(TargetSCSIID,
scsiCmd->LUN_Res >> bLogicalUnitLSB);
break;
}
break;
}
}
else
err = err1;
}
break;
}
}
}
if (NumTries >= kSCSIRetryValue)
err = eReplyTOErr;
ReleaseBufferMemory(scsiCmd, scsiCmdSize);
ReleaseBufferMemory(scsiInst, 100);
return (err);
}
//For simple Xfers you don't need the scsi-2 extra processing.
//- Tom
//Author: D0430